package gcp.cadastros;

import gcp.Amigo;
import gcp.Usuario;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * CadastroAmigo<br>
 * Banco responsavel em manter o cadastro de amigos de usuarios.
 * @author Hildegard Furtado.
 */
public class CadastroAmigo implements Serializable {
    private static final long serialVersionUID = 1L;
    private Map<Usuario, List<Amigo>> amigos;

    /**
     * Construtor default.
     */
    public CadastroAmigo() {
        amigos = new HashMap<Usuario, List<Amigo>>();

    }

    /**
     * Adiciona os amigos do usuario.
     * @param amigo Amigo a ser adicionado.
     * @throws Exception Quando o parametro for nulo.
     */
    public void adicionaAmigo(Usuario usuario, Amigo amigo) throws Exception {
        if (amigo == null) {
            throw new Exception("Amigo invalido");
        }
        if (usuario == null) {
            throw new Exception("Usuario invalido");
        }
        Amigo amigoDaLista = getAmigo(usuario, amigo.getNome(), amigo
                .getSobrenome());
        if (amigoDaLista != null) {
            throw new Exception("Amigo ja cadastrado");
        }
        amigos.get(usuario).add(amigo);
    }

    /**
     * Procura um amigo que o usuario queria encontrar.
     * @param nome Nome do amigo a ser encontrado.
     * @param sobrenome Sobrenome do amigo a ser encontrado.
     * @return O amigo com o nome e sobrenome passado como parametro.
     * @throws Exception laca-a em caso de inexistencia do amigo indicado pelo
     *             Usuario ou Usuario inexistente.
     */
    public Amigo getAmigo(Usuario usuario, String nome, String sobrenome)
            throws Exception {
        List<Amigo> amigo = amigos.get(usuario);
        if (amigo == null) {
            amigo = new ArrayList<Amigo>();
            amigos.put(usuario, amigo);
        }
        if (usuario == null) {
            throw new Exception("Usuario invalido");
        }
        for (Amigo a : amigo) {
            if (a.getNome().equals(nome) && a.getSobrenome().equals(sobrenome)) {
                return a;
            }
        }
        return null;
    }

    /**
     * Remove algum amigo do Usuario.
     * @param amigo Amigo a ser removido.
     * @throws Exception Quando o Amigo ou Usuario indicado for inexistente
     */
    public void removeAmigo(Usuario usuario, Amigo amigo) throws Exception {
        if (amigo == null) {
            throw new Exception("Amigo invalido");
        }
        if (usuario == null) {
            throw new Exception("Usuario invalido");
        }
        Amigo amigo1 = getAmigo(usuario, amigo.getNome(), amigo.getSobrenome());
        if (amigo1 == null) {
            throw new Exception("O usuario não possui o amigo.");
        }
        amigos.get(usuario).remove(amigo);
    }

    /**
     * Retorna a quantidade de Amigos.
     * @return A quantidade de amigos.
     */
    public int getNumeroDeAmigos(Usuario usuario) {
        return amigos.get(usuario).size();
    }

    /**
     * Retorna os Amigos que o Usuario possui.
     * @param usuario Usuario do GCP.
     * @return Lista com todos os amigos do usuario.
     */
    public List<Amigo> getList(Usuario usuario) {
        return amigos.get(usuario);
    }

    /**
     * Retorna um mapa contendo os amigos de um determinado Usuario.
     * @return amigos Mapa cuja chave eh o usuario e valor sao os amigos que
     *         este possui.
     */
    public Map<Usuario, List<Amigo>> getAmigos() {
        return amigos;
    }

    /**
     * Define um mapa cuja chave eh o Usuario e o valor sao os amigos que este
     * possui
     * @param amigos Amigos a serem adicionados.
     */
    public void setAmigos(Map<Usuario, List<Amigo>> amigos) {
        this.amigos = amigos;
    }

    /**
     * Remove o usuario juntamente com seus amigos
     * @param usuario Usuario a ser removido.
     */
    public void removerUsuario(Usuario usuario) {
        amigos.remove(usuario);
    }
}